/**
 * # 参数列表实体类:
 *  Update - 更新通知消息
 * 
 * # 描述:
 *  按关联的数据更新一条通知消息。
 *  
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

package com.waln.notifying.service.args;

/**
 * 功能 更新通知消息 的参数列表。
 */
@pittypat.FunctionAnnotation(transaction = true)
public final class Update extends pittypat.FunctionArgs {
	/**
	 * 发送用户的 Id。
	 * <p>
	 * 发送消息的用户的 Id，如果是系统消息，则为 null。
	 */
	@pittypat.ParameterAnnotation(position = 0, role = pittypat.ParameterRole.USER_ID)
	public java.util.UUID senderId;

	/**
	 * 引用数据的类型。
	 * <p>
	 * 如果此消息来自某业务功能，则可能引用某业务数据，此属性定义业务数据的类型。
	 */
	@pittypat.ParameterAnnotation(position = 1, maxLength = 64)
	public String refDataType;

	/**
	 * 引用数据键值。
	 * <p>
	 * 消息引用数据的键值。
	 */
	@pittypat.ParameterAnnotation(position = 2, maxLength = 50)
	public String refDataKey;

	/**
	 * 紧急程度。
	 * <p>
	 * 通知的紧急程度代码：1-常规，2-紧急，4-特急。默认为常规（1）。
	 */
	@pittypat.ParameterAnnotation(position = 3)
	public Byte urgency;

	/**
	 * 分组。
	 * <p>
	 * 通知隶属的分组。
	 */
	@pittypat.ParameterAnnotation(position = 4, maxLength = 30)
	public String group;

	/**
	 * 通知标题。
	 * <p>
	 * 通知的标题。
	 */
	@pittypat.ParameterAnnotation(position = 5, maxLength = 50)
	public String title;

	/**
	 * 通知消息摘要。
	 * <p>
	 * 对通知消息正文的摘要信息。
	 */
	@pittypat.ParameterAnnotation(position = 6, maxLength = 200)
	public String summary;

	/**
	 * 通知正文内容。
	 * <p>
	 * 通知的完整正文内容。
	 */
	@pittypat.ParameterAnnotation(position = 7, maxLength = 200000)
	public String body;

	/**
	 * 正文类型代码。
	 * <p>
	 * 消息正文类型代码：1-纯文本，2-HTML。
	 */
	@pittypat.ParameterAnnotation(position = 8)
	public Byte bodyType;

	/**
	 * 目标功能路径。
	 * <p>
	 * 点击消息时要进入的路径。
	 */
	@pittypat.ParameterAnnotation(position = 9, maxLength = 300)
	public String funcUrl;

	/**
	 * 附近文件名称。
	 * <p>
	 * 附件文件的名称，包含扩展名称。
	 */
	@pittypat.ParameterAnnotation(position = 10, maxLength = 100)
	public String attachmentName;

	/**
	 * 附件 MIME 类型。
	 * <p>
	 * 附件文件的 MIME 类型。
	 */
	@pittypat.ParameterAnnotation(position = 11, maxLength = 100)
	public String attachmentMime;

	/**
	 * 附件文件的大小。
	 * <p>
	 * 附件文件的大小，单位：字节。
	 */
	@pittypat.ParameterAnnotation(position = 12)
	public Long attachmentSize;

	/**
	 * 文件路径。
	 * <p>
	 * 附近文件的虚拟路径。
	 */
	@pittypat.ParameterAnnotation(position = 13, maxLength = 300)
	public String attachmentUrl;

	/**
	 * 上传人的 Id。
	 * <p>
	 * 上传了当前附件文件的用户的 Id。
	 */
	@pittypat.ParameterAnnotation(position = 14)
	public java.util.UUID attachmentUploaderId;

	/**
	 * 上传时间。
	 * <p>
	 * 上传当前附件文件的时间。
	 */
	@pittypat.ParameterAnnotation(position = 15)
	public java.time.LocalDateTime attachmentUploadTime;

	/**
	 * 原附件文件路径。
	 * <p>
	 * 原附件文件的虚拟路径，用于删除物理文件。
	 */
	@pittypat.ParameterAnnotation(position = 16, direction = pittypat.ParameterDirection.OUT, maxLength = 300)
	public String oldAttachmentUrl;

	/**
	 * 通知消息。
	 * <p>
	 * 更新后的通知消息。
	 */
	@pittypat.ParameterAnnotation(position = 17, direction = pittypat.ParameterDirection.OUT)
	public pittypat.DataList<com.waln.notifying.service.data.Notification> notification;

	/**
	 * 新附件。
	 * <p>
	 * 更新后的附件。
	 */
	@pittypat.ParameterAnnotation(position = 18, direction = pittypat.ParameterDirection.OUT)
	public com.waln.notifying.service.data.Attachment attachment;

	/**
	 * 初始化 Update 类的一个新实例。
	 */
	public Update() {
		super();

		// 发送用户的 Id
		this.senderId = null;
		// 引用数据的类型
		this.refDataType = null;
		// 引用数据键值
		this.refDataKey = null;
		// 紧急程度
		this.urgency = null;
		// 分组
		this.group = null;
		// 通知标题
		this.title = null;
		// 通知消息摘要
		this.summary = null;
		// 通知正文内容
		this.body = null;
		// 正文类型代码
		this.bodyType = null;
		// 目标功能路径
		this.funcUrl = null;
		// 附近文件名称
		this.attachmentName = null;
		// 附件 MIME 类型
		this.attachmentMime = null;
		// 附件文件的大小
		this.attachmentSize = null;
		// 文件路径
		this.attachmentUrl = null;
		// 上传人的 Id
		this.attachmentUploaderId = null;
		// 上传时间
		this.attachmentUploadTime = null;
		// 原附件文件路径
		this.oldAttachmentUrl = null;
		// 通知消息
		this.notification = null;
		// 新附件
		this.attachment = null;
	}

	/**
	 * 获取指定名称的参数值。
	 * 
	 * @param name
	 * 			参数名称，不区分大小写。
	 * @return 指定名称的参数值。
	 */
	@Override
	public Object getParameterValue(String name) {
		if (name == null || name.length() == 0) {
			return null;
		}

		switch (name.toLowerCase()) {
			case "senderid":
				return this.senderId;
			case "refdatatype":
				return this.refDataType;
			case "refdatakey":
				return this.refDataKey;
			case "urgency":
				return this.urgency;
			case "group":
				return this.group;
			case "title":
				return this.title;
			case "summary":
				return this.summary;
			case "body":
				return this.body;
			case "bodytype":
				return this.bodyType;
			case "funcurl":
				return this.funcUrl;
			case "attachmentname":
				return this.attachmentName;
			case "attachmentmime":
				return this.attachmentMime;
			case "attachmentsize":
				return this.attachmentSize;
			case "attachmenturl":
				return this.attachmentUrl;
			case "attachmentuploaderid":
				return this.attachmentUploaderId;
			case "attachmentuploadtime":
				return this.attachmentUploadTime;
			case "oldattachmenturl":
				return this.oldAttachmentUrl;
			case "notification":
				return this.notification;
			case "attachment":
				return this.attachment;
			default:
				return null;
		}
	}

	/**
	 * 设置指定名称的参数值。
	 * 
	 * @param name
	 * 			参数名称，不区分大小写。
	 * @param value
	 * 			参数值。
	 * 
	 * @throws IllegalArgumentException
	 */
	@SuppressWarnings("unchecked")
	@Override
	public void setParameterValue(String name, Object value) throws IllegalArgumentException {
		if (name == null || name.length() == 0) {
			throw new IllegalArgumentException("没有提供有效的参数名称。");
		}

		switch (name.toLowerCase()) {
			case "senderid":
				this.senderId = (java.util.UUID) value;
				break;
			case "refdatatype":
				this.refDataType = (String) value;
				break;
			case "refdatakey":
				this.refDataKey = (String) value;
				break;
			case "urgency":
				this.urgency = (Byte) value;
				break;
			case "group":
				this.group = (String) value;
				break;
			case "title":
				this.title = (String) value;
				break;
			case "summary":
				this.summary = (String) value;
				break;
			case "body":
				this.body = (String) value;
				break;
			case "bodytype":
				this.bodyType = (Byte) value;
				break;
			case "funcurl":
				this.funcUrl = (String) value;
				break;
			case "attachmentname":
				this.attachmentName = (String) value;
				break;
			case "attachmentmime":
				this.attachmentMime = (String) value;
				break;
			case "attachmentsize":
				this.attachmentSize = (Long) value;
				break;
			case "attachmenturl":
				this.attachmentUrl = (String) value;
				break;
			case "attachmentuploaderid":
				this.attachmentUploaderId = (java.util.UUID) value;
				break;
			case "attachmentuploadtime":
				this.attachmentUploadTime = (java.time.LocalDateTime) value;
				break;
			case "oldattachmenturl":
				this.oldAttachmentUrl = (String) value;
				break;
			case "notification":
				this.notification = (pittypat.DataList<com.waln.notifying.service.data.Notification>) value;
				break;
			case "attachment":
				this.attachment = (com.waln.notifying.service.data.Attachment) value;
				break;
			default:
				throw new IllegalArgumentException(name + " 不是 " + this.getClass().getName() + " 的有效参数属性名称。");
		}
	}

	/**
	 * 将当前对象作为 JSON 字符串写入指定的文本流。
	 * 
	 * @param writer
	 * 			目标文本流。
	 * 
	 * @throws IllegalArgumentException
	 * @throws java.io.IOException
	 */
	@Override
	public void write(java.io.Writer writer) throws IllegalArgumentException, java.io.IOException {
		if (writer == null) {
			throw new IllegalArgumentException("writer 为 null。");
		}

		writer.write('{');

		// 发送用户的 Id
		writer.write("\"senderId\":");
		pittypat.Json.write(writer, this.senderId);
		writer.write(',');

		// 引用数据的类型
		writer.write("\"refDataType\":");
		pittypat.Json.write(writer, this.refDataType);
		writer.write(',');

		// 引用数据键值
		writer.write("\"refDataKey\":");
		pittypat.Json.write(writer, this.refDataKey);
		writer.write(',');

		// 紧急程度
		writer.write("\"urgency\":");
		pittypat.Json.write(writer, this.urgency);
		writer.write(',');

		// 分组
		writer.write("\"group\":");
		pittypat.Json.write(writer, this.group);
		writer.write(',');

		// 通知标题
		writer.write("\"title\":");
		pittypat.Json.write(writer, this.title);
		writer.write(',');

		// 通知消息摘要
		writer.write("\"summary\":");
		pittypat.Json.write(writer, this.summary);
		writer.write(',');

		// 通知正文内容
		writer.write("\"body\":");
		pittypat.Json.write(writer, this.body);
		writer.write(',');

		// 正文类型代码
		writer.write("\"bodyType\":");
		pittypat.Json.write(writer, this.bodyType);
		writer.write(',');

		// 目标功能路径
		writer.write("\"funcUrl\":");
		pittypat.Json.write(writer, this.funcUrl);
		writer.write(',');

		// 附近文件名称
		writer.write("\"attachmentName\":");
		pittypat.Json.write(writer, this.attachmentName);
		writer.write(',');

		// 附件 MIME 类型
		writer.write("\"attachmentMime\":");
		pittypat.Json.write(writer, this.attachmentMime);
		writer.write(',');

		// 附件文件的大小
		writer.write("\"attachmentSize\":");
		pittypat.Json.write(writer, this.attachmentSize);
		writer.write(',');

		// 文件路径
		writer.write("\"attachmentUrl\":");
		pittypat.Json.write(writer, this.attachmentUrl);
		writer.write(',');

		// 上传人的 Id
		writer.write("\"attachmentUploaderId\":");
		pittypat.Json.write(writer, this.attachmentUploaderId);
		writer.write(',');

		// 上传时间
		writer.write("\"attachmentUploadTime\":");
		pittypat.Json.write(writer, this.attachmentUploadTime);
		writer.write(',');

		// 原附件文件路径
		writer.write("\"oldAttachmentUrl\":");
		pittypat.Json.write(writer, this.oldAttachmentUrl);
		writer.write(',');

		// 通知消息
		writer.write("\"notification\":");
		pittypat.Json.write(writer, this.notification);
		writer.write(',');

		// 新附件
		writer.write("\"attachment\":");
		pittypat.Json.write(writer, this.attachment);

		writer.write('}');
	}
}
